'''
Created on 13/10/2013

@author: daniel
'''
import listaEnlazada
import unittest


class Recorredor(object):
    '''
    decora una lista para recorrerla mas facilmente
    '''
    def __init__(self,lista):
        self.lista=lista

    def comenzar(self):
        self.actual=0

    def elemento(self):
        return self.lista.elemento(self.actual)
    
    def proximo(self):
        if(self.lista.getTamanio()>self.actual):self.actual+=1
        
    def fin(self):
        if (self.lista.getTamanio()-self.actual==0): return True
        return self.lista.esVacia()
    
    def agregar(self,elem):
        self.lista.agregar(elem,self.actual)
        
    def eliminar(self):
        return self.lista.eliminar(self.actual)
        


class Test(unittest.TestCase):


    def testName(self):
        self.assertIsInstance(Recorredor(34),Recorredor ,"Verifica creacion")
    
    def testComenzar(self):
        first=Recorredor(32)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")

    def testElemento(self):
        first=Recorredor(32)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")

    def testProximo(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        first.proximo()
        self.assertEquals(first.actual,1,"verifica comienzo del recorrido")

    def testFin(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.proximo()
        self.assertFalse(first.fin(),"Verifica no fin de la lista")
        first.proximo()
        self.assertFalse(first.fin(),"Verifica fin de la lista")
        

    def testAgregar(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        first.proximo()
        first.agregar(56)
        self.assertEquals(lista1.elemento(1),56,"verifica elemento agregado")

    def testEliminar(self):
        lista1=listaEnlazada.ListaEnlazada()
        lista1.agregar(213,500)
        lista1.agregar(313,500)
        lista1.agregar(314,500)
        first=Recorredor(lista1)
        first.comenzar()
        self.assertEquals(first.actual,0,"verifica comienzo del recorrido")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica fin de la lista")
        first.eliminar()
        self.assertFalse(first.fin(),"Verifica fin de la lista")
        first.eliminar()
        self.assertTrue(first.fin(),"Verifica fin de la lista")
        

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()